Skip to content

[pull] main from TryGhost:main#927

Merged
pull[bot] merged 24 commits intocode:mainfrom
TryGhost:main
Feb 18, 2026
Merged

[pull] main from TryGhost:main#927
pull[bot] merged 24 commits intocode:mainfrom
TryGhost:main

Conversation

@pull
Copy link

@pull pull bot commented Feb 18, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

mike182uk and others added 24 commits February 18, 2026 16:35
…low (#26438)

ref https://linear.app/ghost/issue/BER-3295

Members with expired offer discounts were blocked from seeing or
claiming retention offers because the guards only checked for `offer_id`
presence. The new `hasActiveOffer` utility checks
`discount_start`/`discount_end`, active trials, and falls back to offer
duration lookup for legacy data
ref https://ghost.slack.com/archives/C02G9E68C/p1771428472410089
- improved looping logic and resilience to errors
- added dry run option
ref #26449

This PR was intended to bump Portal, however the CI job that ran to
validate the Portal bump ran before the bump happened, leading to a
false pass.
ref
https://github.com/TryGhost/Ghost/actions/runs/22150423065/job/64040429159

The "Can browse reporters for a comment" and "Can browse comment likes"
tests
were flaky because they created multiple reports/likes without explicit
timestamps. When both were created in the same millisecond, the
`order: 'created_at desc'` query returned results in non-deterministic
order,
causing snapshot mismatches.

Added explicit created_at timestamps using db.knex().update() to ensure
deterministic ordering, matching the pattern already used in the
"Orders reports/likes by created_at desc" tests.
This test-only change should have no user impact.
This test-only change should have no user impact.
no ref

This test-only change should have no user impact.
closes https://linear.app/ghost/issue/BER-3350/
closes #26473

- Fixed the settings page not being scrollable at mobile sizes (below 860px) when the sidebar is hidden
- The page wrapper only applied `fixed` positioning and `h-full` at the `tablet` breakpoint, so on smaller screens the content area had no height constraint and `overflow-y-scroll` had no effect
- Applied `fixed left-0 top-0 flex h-full` at all sizes so the content scroller works on mobile too
This test-only change should have no user impact.
ref https://linear.app/ghost/issue/NY-1044/
ref TryGhost/Koenig#1736
- added additional plugins and nodes behind feature flag

This change requires either yarn link'ing with the above PR or bumping
Koenig in Ghost after merging the PR.

We have a few rough edges with styles (bookmarks, callouts) and a few
pieces that don't fully work (image + file cards require fileUpload
hook), snippets (require cardConfig) that we can bite off sequentially.
no ref

This test-only change should have no user impact.
no ref

This test-only change should have no user impact.
no ref

This test-only change should have no user impact.
no ref

This test-only change should have no user impact.
no ref

This test-only change should have no user impact.
no ref

This test-only change should have no user impact.
ref
8b12475

This was supposed to contain the lock file.
…orrect results (#26458)

ref https://linear.app/ghost/issue/ONC-1446/member-filtering-issue

This commit updates @tryghost/nql to v0.12.10, which includes a
[fix](TryGhost/NQL@9047935)
for a bug in Ghost Admin's member filtering when more than one date
based filter is applied.

## Summary

When filtering members in Admin using the following filters, Ghost was
returning members that should not have been included in the results:
- Member status: paid
- Stripe Subscription Status: active
- Billing Period: Monthly
- Next Billing Date: on or after Feb 1, 2026
- Next Billing Date: on or before Feb 28, 2026

The filtering was also order dependent - if you swapped the two filters
on Billing Date, the results could be completely different.

## Root cause

NQL would treat the above filters as two separate sub queries:
1. Member status: paid, subscription status: active, billing period:
monthly, next billing date >= Feb 1, 2026
2. Next billing date <= Feb 28, 2026

The additional date-based filter was being split into its own subquery,
such that any member with any subscription with a next billing date
prior to Feb 28, 2026 would be included in the results - regardless of
whether the matching subscription was active or billed monthly. The
ordering was also important, because it's always the second condition
that gets orphaned into its own subquery, and would return different
results.

## Fix

The fix for this bug was in NQL
[here](TryGhost/NQL@9047935).
Ultimately it ensures that range based filters, like our next billing
date filter, are grouped into the same subquery, rather than split out
into its own subquery. This prevents members with e.g. cancelled
subscriptions with a next billing date in the past from being included
in the example query above.
no ref

With the update to the React-based Admin app, we've overhauled the dev
setup to lean fully into Docker. This commit removes the old/legacy
setup to prevent confusion on what's the intended way to develop with
Ghost.

The `dev.js` script has handled many tasks in the past. It appears to me
as if the browser tests are the only necessary use case right now, so
I've stripped away the unnecessary pieces and moved/renamed it to a
dedicated script describing its purpose.
no ref

This test-only change should have no user impact.
No ref. 

Our popovers had excessive top margin so I removed it. Also improved the
ordering of the elements in the user details modal, made the delete
action destructive and updated the delete modal phrasing to make sense.

| Before | After |
|--------|--------|
| <img width="336" height="234" alt="Screenshot 2026-02-18 at 20 17 28"
src="https://github.com/user-attachments/assets/e3a080b4-7d8c-475e-ac02-3043a22f0240"
/> | <img width="369" height="236" alt="Screenshot 2026-02-18 at 20 17
06"
src="https://github.com/user-attachments/assets/8038b5c2-296a-4bc1-adc3-6e5bf49b137d"
/> |
**Changes:**

Updated the Bulgarian translation of `comments.json` and `portal.json`
to include recently added strings.
Refined some existing translations for better clarity, conciseness, and
improved UI consistency.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Translation-only JSON string updates with no logic changes; risk is
limited to minor UI text regressions or missing translations.
> 
> **Overview**
> **Updates Bulgarian (`bg`) UI translations** for comments and Portal
by filling in previously empty strings and refining wording for
consistency.
> 
> This adds missing labels/messages (e.g., commenting restrictions,
admin view link, billing/next payment, “open mail provider” actions, and
billing-update failures) and tweaks several existing phrases from
“актуализиран/актуализиране” to “обновен/обновяване” and similar copy
edits.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5f64dd7. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
no ref

This test-only change should have no user impact.
no ref

This test-only change should have no user impact.

`git grep -F .should.` returns no results after this change.
@pull pull bot locked and limited conversation to collaborators Feb 18, 2026
@pull pull bot added the ⤵️ pull label Feb 18, 2026
@pull pull bot merged commit 6c1227c into code:main Feb 18, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

Comments